/**
 * @file 数据库管理器
 * @description 统一管理数据库连接、服务和生命周期
 * @author 黄敏
 * @version 1.0.0
 * @since 2025-08-05
 */

import { closeDatabase, getDatabaseStats, initializeDatabase, isDatabaseConnected } from './index'
import { BrowsingHistoryService } from './services/browsing-history.service'
import { PasswordManagerService } from './services/password-manager.service'
import { AsyncTaskService } from './services/task.service'
import { BookmarkManagerService } from './services/bookmark.service'

/**
 * 数据库管理器类
 * 提供统一的数据库管理接口
 */
export class DatabaseManager {
  private static instance: DatabaseManager | null = null
  private browsingHistoryService: BrowsingHistoryService | null = null
  private bookmarkService: BookmarkManagerService | null = null

  private passwordManagerService: PasswordManagerService | null = null
  private asyncTaskService: AsyncTaskService | null = null
  private isInitialized = false

  /**
   * 获取数据库管理器实例（单例模式）
   */
  static getInstance(): DatabaseManager {
    if (!this.instance) {
      this.instance = new DatabaseManager()
    }
    return this.instance
  }

  /**
   * 私有构造函数
   */
  private constructor() {
    // 私有构造函数，确保单例模式
  }

  /**
   * 初始化数据库管理器
   */
  async initialize(): Promise<void> {
    try {
      if (this.isInitialized) {
        console.log('📊 数据库管理器已初始化，跳过重复初始化')
        return
      }

      console.log('🚀 正在初始化数据库管理器...')

      // 初始化数据库连接
      initializeDatabase()

      // 初始化服务
      this.browsingHistoryService = BrowsingHistoryService.getInstance()
      this.bookmarkService = BookmarkManagerService.getInstance()
      this.passwordManagerService = PasswordManagerService.getInstance()
      this.asyncTaskService = AsyncTaskService.getInstance()

      this.isInitialized = true
      console.log('✅ 数据库管理器初始化成功')

      // 输出数据库统计信息
      this.logDatabaseStats()
    } catch (error) {
      console.error('❌ 数据库管理器初始化失败:', error)
      throw new Error(`数据库管理器初始化失败: ${error}`)
    }
  }

  /**
   * 关闭数据库管理器
   */
  async shutdown(): Promise<void> {
    try {
      if (!this.isInitialized) {
        console.log('📊 数据库管理器未初始化，无需关闭')
        return
      }

      console.log('🔄 正在关闭数据库管理器...')

      // 关闭数据库连接
      closeDatabase()

      // 清理服务引用
      this.browsingHistoryService = null
      this.bookmarkService = null
      this.passwordManagerService = null
      this.asyncTaskService = null
      this.isInitialized = false

      console.log('✅ 数据库管理器已关闭')
    } catch (error) {
      console.error('❌ 关闭数据库管理器失败:', error)
      throw new Error(`关闭数据库管理器失败: ${error}`)
    }
  }

  /**
   * 获取浏览记录服务
   */
  getBrowsingHistoryService(): BrowsingHistoryService {
    if (!this.isInitialized || !this.browsingHistoryService) {
      throw new Error('数据库管理器未初始化或浏览记录服务不可用')
    }
    return this.browsingHistoryService
  }

  /**
   * 获取密码管理器服务
   */
  /**
   * 获取书签服务
   */
  getBookmarkService(): BookmarkManagerService {
    if (!this.isInitialized || !this.bookmarkService) {
      throw new Error('数据库管理器未初始化或书签服务不可用')
    }
    return this.bookmarkService
  }

  getPasswordManagerService(): PasswordManagerService {
    if (!this.isInitialized || !this.passwordManagerService) {
      throw new Error('数据库管理器未初始化或密码管理器服务不可用')
    }
    return this.passwordManagerService
  }

  /**
   * 获取异步任务服务
   */
  getAsyncTaskService(): AsyncTaskService {
    if (!this.isInitialized || !this.asyncTaskService) {
      throw new Error('数据库管理器未初始化或异步任务服务不可用')
    }
    return this.asyncTaskService
  }

  /**
   * 检查数据库管理器是否已初始化
   */
  isReady(): boolean {
    return this.isInitialized && isDatabaseConnected()
  }

  /**
   * 输出数据库统计信息
   */
  private logDatabaseStats(): void {
    try {
      const stats = getDatabaseStats()
      console.log('📊 数据库统计信息:')
      console.log(`  📁 数据库路径: ${stats.dbPath}`)
      console.log(`  🔗 连接状态: ${stats.isConnected ? '已连接' : '未连接'}`)
      console.log(`  📋 模式版本: ${stats.schemaVersion}`)
      console.log(`  📝 浏览记录数量: ${stats.browsingHistoryCount}`)
      console.log(`  🔐 用户凭据数量: ${stats.userCredentialCount}`)
      console.log(`  📋 异步任务数量: ${stats.asyncTaskCount}`)
    } catch (error) {
      console.error('❌ 获取数据库统计信息失败:', error)
    }
  }

  /**
   * 健康检查
   * 检查数据库连接和服务状态
   */
  async healthCheck(): Promise<{
    healthy: boolean
    issues: string[]
    stats: ReturnType<typeof getDatabaseStats>
  }> {
    const issues: string[] = []
    let healthy = true

    try {
      // 检查初始化状态
      if (!this.isInitialized) {
        issues.push('数据库管理器未初始化')
        healthy = false
      }

      // 检查数据库连接
      if (!isDatabaseConnected()) {
        issues.push('数据库连接已断开')
        healthy = false
      }

      // 检查服务可用性
      if (!this.browsingHistoryService) {
        issues.push('浏览记录服务不可用')
        healthy = false
      }

      // 尝试执行简单查询测试连接
      if (this.browsingHistoryService) {
        const countResult = await this.browsingHistoryService.getRecordCount()
        if (!countResult.success) {
          issues.push(`数据库查询失败: ${countResult.error}`)
          healthy = false
        }
      }

      const stats = getDatabaseStats()

      if (healthy) {
        console.log('✅ 数据库健康检查通过')
      } else {
        console.warn('⚠️ 数据库健康检查发现问题:', issues)
      }

      return {
        healthy,
        issues,
        stats
      }
    } catch (error) {
      console.error('❌ 数据库健康检查失败:', error)
      return {
        healthy: false,
        issues: [`健康检查执行失败: ${error}`],
        stats: getDatabaseStats()
      }
    }
  }

  /**
   * 重新初始化数据库管理器
   * 用于错误恢复
   */
  async reinitialize(): Promise<void> {
    try {
      console.log('🔄 正在重新初始化数据库管理器...')

      // 先关闭现有连接
      await this.shutdown()

      // 重新初始化
      await this.initialize()

      console.log('✅ 数据库管理器重新初始化成功')
    } catch (error) {
      console.error('❌ 数据库管理器重新初始化失败:', error)
      throw new Error(`数据库管理器重新初始化失败: ${error}`)
    }
  }
}

/**
 * 导出数据库管理器实例
 */
export const databaseManager = DatabaseManager.getInstance()

/**
 * 便捷的初始化函数
 */
export async function initializeDatabaseManager() {
  await databaseManager.initialize()
}

/**
 * 便捷的关闭函数
 */
export async function shutdownDatabaseManager(): Promise<void> {
  await databaseManager.shutdown()
}

/**
 * 便捷的健康检查函数
 */
export async function checkDatabaseHealth(): Promise<ReturnType<DatabaseManager['healthCheck']>> {
  return await databaseManager.healthCheck()
}
